<?php
/**
 * Nweb Framework
 *
 * This script is protected by copyright. It's use, copying, modification
 * and distribution without written consent of the author is prohibited.
 *
 * @category    source
 * @package     pl.nweb.framework.config
 * @subpackage  manager
 * @author      Krzysztof Kardasz <krzysztof.kardasz@gmail.com>
 * @copyright   Copyright (c) 2011 Krzysztof Kardasz
 * @license     http://www.gnu.org/licenses/lgpl-3.0.txt  GNU Lesser General Public
 * @version     3.0 $Id$
 * @link        http://code.google.com/p/nweb-framework/
 * @link        http://framework.nweb.pl
 */

namespace pl\nweb\framework\config\manager;

/**
 * Menadżer konfiguracji aplikacji
 * Struktura katalogów:
 * 	configs
 *    + override (nadpisania dla standard)
 *      + env	 (nadpisania dla standard/env)
 *        + ...
 *    + standard (standardowa konfiguracja)
 *       + env   (podział na środowiska: production, development, test etc.)
 *         + ..
 *       + application.php (główna konfiguracja)   
 *
 * @category    source
 * @package     pl.nweb.framework.config
 * @subpackage  manager
 * @author      Krzysztof Kardasz <krzysztof.kardasz@gmail.com>
 * @copyright   Copyright (c) 2011 Krzysztof Kardasz
 * @version     3.0 $Id$
 */
class Application 
{
    /**
     * Katalog z plikami konfiguracji
     *  
     * @var string
     */
    private $_dir = null;
    
    /**
     * Środowisko
     *  
     * @var null|string
     */
    private $_env = null;
    
    /**
     *  Kolekcja obiektów konfiguracji
     *  
     *  @var array
     */
    private $_configs = array();
    
    /**
     *  Kolekcja adapterów konfiguracji (lista obsługiwanych formatów)
     *  
     *  @var array
     */
    private $_adapters = array(
        'php' => '\pl\nweb\framework\config\adapter\Php'
    );
    
    /**
     * Konstruktor
     * 
     * @param string $dir katalog z plikami konfiguracji
     * @param null|string $env środowisko (production, development, test etc.)
     * @throws Exception
     */
    public function __construct ($dir, $env = null)
    {
        if(is_dir($dir)) {
            $this->_dir = $dir;
            $this->_env = $env;
        } else {
            throw new Exception ('Config path "' . $dir. '" not exists');
        }
    }
    
    /**
     * Zwraca obiekt konfiguracji
     * 
     * @param string $name nazwa
     * @param string $format format pliku (domyślnie php)
     * @return \pl\nweb\framework\Config
     */
    public function getConfig ($name, $format = 'php')
    {
        if(!isset($this->_configs[$name . '.' . $format])) {
            if(!isset($this->_adapters[$format])) {
                throw new Exception ('Format "' . $format . '" is not supported');
            }
            
            $adapterClass = $this->_adapters[$format];
            
            $standard     = $this->_dir . DIRECTORY_SEPARATOR . 'standard';
            $override     = $this->_dir . DIRECTORY_SEPARATOR . 'override';
            $standard_env = null;
            $override_env = null;
            
            if($this->_env) {
                $standard_env = $standard . DIRECTORY_SEPARATOR . 'env' . DIRECTORY_SEPARATOR . $this->_env;
                $override_env = $override . DIRECTORY_SEPARATOR . 'env' . DIRECTORY_SEPARATOR . $this->_env;
            }
            
            $files = array($standard . DIRECTORY_SEPARATOR . $name . '.' . $format);
            if($standard_env) {
                $files[] = $standard_env  . DIRECTORY_SEPARATOR . $name . '.' . $format;
            }
            $files[] = $override . DIRECTORY_SEPARATOR . $name . '.' . $format;
            if($override_env) {
                $files[] = $override_env . DIRECTORY_SEPARATOR . $name . '.' . $format;
            }
            
            $data  = array();
            foreach($files as $file) {
                if($results = $adapterClass::read($file)) {
                    $data = array_merge($data, $results);
                }
            }
            $this->_configs[$name . '.' . $format] = new \pl\nweb\framework\Config ($data);
        }
        return $this->_configs[$name . '.' . $format];
    }
}